namespace ConsoleApp1;

public class WithExpression
{
    public record NamedPoint(string Name, int X, int Y);

    //with 表达式的左侧操作数可以是一个记录类型。 从 C# 10 开始，with 表达式的左侧操作数也可以为结构类型或匿名类型。
    public static void t1()
    {
        var p1 = new NamedPoint("A", 0, 0);

        var p2 = new NamedPoint("B", 1, 10);
    }


    private record TaggedNumber(int Number, List<string> Tags)
    {
        public string PrintTags() => string.Join(", ", Tags);
    }

    //对于引用类型成员，在复制操作数时仅复制对成员实例的引用。 副本和原始操作数都具有对同一引用类型实例的访问权限。 以下示例演示了该行为：
    public static void t2()
    {
        var original = new TaggedNumber(1, new List<string> { "A", "B" });

        var copy = original with { Number = 2 };
        Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
        // output: Tags of copy: A, B

        original.Tags.Add("C");
        Console.WriteLine($"Tags of {nameof(copy)}: {copy.PrintTags()}");
        // output: Tags of copy: A, B, C
    }
}